package com.yazi.mxz.common.service;

import java.util.List;

import com.myframework.smhj.common.exception.MyException;
import com.myframework.smhj.hibernate.Searching;
import com.myframework.smhj.hibernate.Page;
import com.myframework.smhj.hibernate.dao.Service;
import com.yazi.mxz.common.entity.beans.Member;
import com.yazi.mxz.common.entity.beans.LocalSaleGoods;
import com.yazi.mxz.common.entity.beans.Order;
import com.yazi.mxz.common.entity.beans.Store;
import com.yazi.mxz.common.entity.custom.LocalSales4Sync;
import com.yazi.mxz.common.entity.custom.Order4Search;
import com.yazi.mxz.common.entity.custom.Orders4Form;
import com.yazi.mxz.common.entity.enums.OrderStatus;


public interface OrderService extends Service<Order> {
	
	/**
	 * 添加用户订单
	 * @param member 用户(游离对象)
	 * @param ordersObject 订单(s)(表单对象)
	 */
	void addByMember(Member member, Orders4Form ordersObject) 
			throws MyException;
	
	/**
	 * 添加销售订单,即奖线下销售单转换成最终成交订单
	 * @param store 店铺(游离对象)
	 * @param checker 营业员(游离对象)
	 * @param saleId 销售单ID
	 * @param saleGoodses 销售品(s)
	 * @param pay 实付金额(未找零)
	 * @param change 找零金额
	 * @return
	 */
	Order addByStore(Store store, Member checker, long saleId, List<LocalSaleGoods> saleGoodses, 
			Float pay, Float change) throws MyException;

	/**
	 * 添加离线订单(批量)
	 * @param store 店铺(游离对象)
	 * @param list 离线数据
	 * @throws MyException 
	 */
	void addByStoreForSync(Store store, LocalSales4Sync list) throws MyException;
	
	/**
	 * 订单复杂查询
	 * @param order
	 * @param si
	 * @return
	 */
	Page<Order> list(Order4Search order, Searching si);
	
	/**
	 * 更新店铺订单状态
	 * @param store 店铺(游离对象)
	 * @param orderId 订单ID
	 * @param status 目标状态
	 * @return 设置后的状态值，如果为null则表示更新失败
	 */
	OrderStatus editStatusByStore(Store store, long orderId, OrderStatus status);

	/**
	 * 更新用户订单状态
	 * @param memberId 用户ID
	 * @param orderCode 订单号
	 * @param status 目标状态
	 * @return  设置后的状态值，如果为null则表示更新失败
	 */
	OrderStatus editStatusByMemberId(long memberId, String orderCode, OrderStatus status);
	
	/**
	 * 删除店铺订单
	 * @param store 店铺(游离对象)
	 * @param orderId 订单ID
	 * @return
	 */
	boolean removeByStore(Store store, long orderId);
	
	/**
	 * 删除用户订单
	 * @param memberId 用户ID
	 * @param orderCode 订单编号
	 * @return
	 */
	boolean removeByMemberId(long memberId, String orderCode);
	
	/**
	 * 根据查询条件获取订单数
	 * @param order
	 * @param searchWord
	 * @return
	 */
	int count(Order4Search order, String searchWord);

	/**
	 * 下一个要自动确认收货的订单（由Job任务调用）
	 * @return
	 */
	Order oneNextSuccess();

	/**
	 * 下一个要自动确认退货的订单（由Job任务调用）
	 * @return
	 */
	Order oneNextReturned();
	
	/**
	 * 确认退货（由Job任务调用）
	 * @param orderId
	 */
	void editToReturned(long orderId);
	
	/**
	 * 确认订单（由Job任务调用）
	 * @param orderId
	 */
	void editToSuccess(long orderId);

	
}
